package com.gitee.zzh;

import com.gitee.zzh.common.MyIOUtils;
import com.gitee.zzh.sqllineage.ref.TableColumnRef;
import com.gitee.zzh.sqllineage.ref.TableRef;
import com.gitee.zzh.sqllineage.transform.ReplaceStarFields;
import com.gitee.zzh.sqllineage.transform.ReplaceText;
import com.gitee.zzh.sqllineage.transform.TransformText;
import com.gitee.zzh.sqllineage.util.SqlStringUtils;
import com.gitee.zzh.sqllineage.vo.TransformVO;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

/**
 * sql依赖关系解析工具类
 */
public class SqlLineageDemo {

    public static void main(String[] args) {
        long time0 = System.currentTimeMillis();
        String path = "E:/java-spring/sqlscript-lineage-analysis/src/main/resources/DEMO.sql";
        //表对应关系
//        testTable(path);
        //表和字段对应关系
        testTableColumn(path);
        System.out.println("cost time: " + (System.currentTimeMillis() - time0));
    }

    private static void testTable(String path) {
        //获取sql脚本文本内容
        String text = MyIOUtils.getText(path);
        //初始化替换文本内容
        String text1 = ReplaceText.replaceCommon(text);
        //子查询提取成临时表
        String text2 = TransformText.getTransformedText(text1);
        //特殊符号替换，简化后续代码以便提升代码效率
        String text3 = SqlStringUtils.getReplacedSimpleText(text2);
        TransformVO transformVO = new TransformVO();
        transformVO.setText(text3);
        String[] textArr = text3.split(";");
        transformVO.setTextArr(textArr);
        //获取目标表和对应的临时表
        Set<Map<String,String>> tableMapSet = SqlStringUtils.getTargetTable(transformVO);
        //获取并保存目标表和来源表的集合
        Set<String> insertSet = new TreeSet<>();
        //获取并保存目标表和临时来源表的集合
        Set<String> tempTableColummSet = new HashSet<>();
        for (Map<String,String> map : tableMapSet) {
            String tableName = map.get("tableName");
            String tableNameTemp = map.get("tableNameTemp");
            transformVO.setTableName(tableName);
            transformVO.setTableNameTemp(tableNameTemp);
            //添加初次获取的数据和临时来源表数据到集合
            tempTableColummSet.addAll(TableRef.getFirstTable(transformVO, insertSet));
        }
        //添加后续获取的数据和来源表数据到集合
        TableRef.getTable(transformVO, tempTableColummSet, insertSet);
        for (String tsTable : insertSet) {
            System.out.println(tsTable);
        }
    }

    private static void testTableColumn(String path) {
        //获取sql脚本文本内容
        String text = MyIOUtils.getText(path);
        //初始化替换文本内容
        String text1 = ReplaceText.replaceCommon(text);
        //子查询提取成临时表
        String text2 = TransformText.getTransformedText(text1);
        TransformVO transformVO = new TransformVO();
        //dao相关查询字段方法的实现类
        transformVO.setTableColumnInfo(new TableColumnInfoImpl());
        transformVO.setText(text2);
        //替换select与from之间的*为具体字段
        String text3 = ReplaceStarFields.getReplacedStarText(transformVO);
        //替换select后面的函数括号内的”，“为”|“
        String text4 = ReplaceText.getReplaceComma(text3);
        //特殊符号替换，简化后续代码以便提升代码效率
        String text5 = SqlStringUtils.getReplacedSimpleText(text4);
        String[] textArr = text5.split(";");
        transformVO.setText(text5);
        transformVO.setTextArr(textArr);
        //获取目标表和对应的临时表
        Set<Map<String,String>> tableMapSet = SqlStringUtils.getTargetTable(transformVO);
        //获取并保存目标字段和来源字段的集合
        Set<String> insertSet = new TreeSet<>();
        //获取并保存目标字段和临时表的来源字段的集合
        Set<String> tempTableColummSet = new HashSet<>();
        for (Map<String,String> map : tableMapSet) {
            String tableName = map.get("tableName");
            String tableNameTemp = map.get("tableNameTemp");
            transformVO.setTableName(tableName);
            transformVO.setTableNameTemp(tableNameTemp);
            //添加初次获取的数据和临时来源表字段数据到集合
            tempTableColummSet.addAll(TableColumnRef.getFirstTableColumn(transformVO, insertSet));
        }
        //添加后续获取的数据和来源表字段数据到集合
        TableColumnRef.getTableColumn(transformVO, tempTableColummSet, insertSet);
        MyIOUtils.createOrClear("E:/sqllineage-result.sql");
        MyIOUtils.append("E:/sqllineage-result.sql", String.join("\n", insertSet));
    }

}
